import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class Solution {

    /**
     * 给你链表的头节点 head ，每 k 个节点一组进行翻转，请你返回修改后的链表。
     * k 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
     * 你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        if (k == 1) {
            return head;
        }

        List<ListNode> list = new ArrayList<>(k);
        ListNode cur = head;
        ListNode end;

        for (int i = 0; i < k; i++) {
            list.add(0, cur);
            cur = cur.next;
            if (Objects.isNull(cur)) {
                break;
            }
        }
        if (list.size() < k) {
            return head;
        } else {
            head = list.get(0);
            for (int i = 0; i < k - 1; i++) {
                list.get(i).next = list.get(i + 1);
            }
            end = list.get(k - 1);
            list.clear();
        }

        while (Objects.nonNull(cur)) {
            list.add(0, cur);
            cur = cur.next;

            if (list.size() == k) {
                end.next = list.get(0);
                for (int i = 0; i < k - 1; i++) {
                    list.get(i).next = list.get(i + 1);
                }
                end = list.get(k - 1);
                list.clear();
            }
        }

        if (list.size() > 0) {
            end.next = list.get(list.size() - 1);
        } else {
            end.next = null;
        }

        return head;

    }

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode pre = head;
        for (int i = 2; i < 7; i++) {
            pre.next = new ListNode(i);
            pre = pre.next;
        }

        ListNode newList = new Solution().reverseKGroup(head, 2);
        System.out.println("done");

    }

}
